cmake_minimum_required(VERSION 2.8)

PROJECT(IES2HDR)

IF(CMAKE_GENERATOR MATCHES "ARM")
    SET(LIBRARY_OUT_NAME "ARM")
ELSEIF(CMAKE_GENERATOR MATCHES "Win64")
    SET(LIBRARY_OUT_NAME "64")
    SET(WIN64 TRUE)
ELSEIF(CMAKE_GENERATOR MATCHES "Visual Studio")
    SET(LIBRARY_OUT_NAME "86")
    SET(WIN32 TRUE)
ELSE()
    SET(LIBRARY_OUT_NAME "86")
ENDIF()

SET(CMAKE_DEBUG_POSTFIX "_d" CACHE STRING "Adds a postfix for debug-built libraries.")
SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "Adds a postfix for release-built libraries.")
SET(CMAKE_RELWITHDEBINFO_POSTFIX "_RelWithDebugInfo" CACHE STRING "adds a postfix for ReleaseWithDebug-built libraries.")
SET(CMAKE_MINSIZEREL_POSTFIX "_MinsizeRel" CACHE STRING "adds a postfix for MinsizeRelease-built libraries.")

SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib/binaries/${PLATFORM_NAME}${LIBRARY_OUT_NAME})
SET(LIBRARY_OUTPUT_PATH_DEBUG ${LIBRARY_OUTPUT_PATH})
SET(LIBRARY_OUTPUT_PATH_RELEASE ${LIBRARY_OUTPUT_PATH})
SET(LIBRARY_OUTPUT_PATH_RELWITHDEBINFO ${LIBRARY_OUTPUT_PATH})
SET(LIBRARY_OUTPUT_PATH_MINSIZEREL ${LIBRARY_OUTPUT_PATH})

MACRO(SET_TARGET_ATTRIBUTE target directory)
    SET_TARGET_PROPERTIES(${target} PROPERTIES
        ARCHIVE_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
        ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${LIBRARY_OUTPUT_PATH_DEBUG}
        ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${LIBRARY_OUTPUT_PATH_RELEASE}
        ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO ${LIBRARY_OUTPUT_PATH_RELWITHDEBINFO}
        ARCHIVE_OUTPUT_DIRECTORY_MINSIZEREL ${LIBRARY_OUTPUT_PATH_MINSIZEREL}
        LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
        LIBRARY_OUTPUT_DIRECTORY_DEBUG ${LIBRARY_OUTPUT_PATH_DEBUG}
        LIBRARY_OUTPUT_DIRECTORY_RELEASE ${LIBRARY_OUTPUT_PATH_RELEASE}
        LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO ${LIBRARY_OUTPUT_PATH_RELWITHDEBINFO}
        LIBRARY_OUTPUT_DIRECTORY_MINSIZEREL ${LIBRARY_OUTPUT_PATH_MINSIZEREL}
        RUNTIME_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
        RUNTIME_OUTPUT_DIRECTORY_DEBUG ${LIBRARY_OUTPUT_PATH_DEBUG}
        RUNTIME_OUTPUT_DIRECTORY_RELEASE ${LIBRARY_OUTPUT_PATH_RELEASE}
        RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${LIBRARY_OUTPUT_PATH_RELWITHDEBINFO}
        RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL ${LIBRARY_OUTPUT_PATH_MINSIZEREL}
    )
    SET_TARGET_PROPERTIES(${target} PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX})
    SET_TARGET_PROPERTIES(${target} PROPERTIES PROJECT_LABEL ${target})
    SET_TARGET_PROPERTIES(${target} PROPERTIES FOLDER ${directory})
    IF(MINGW OR CMAKE_GENERATOR MATCHES "Unix")
        STRING(REGEX REPLACE "lib" "" target_name ${target})
        SET_TARGET_PROPERTIES(${target} PROPERTIES OUTPUT_NAME ${target_name})
    ENDIF()
    IF(CMAKE_GENERATOR MATCHES "Visual Studio")
        IF(VCMDDAndroid)
            SET_PROPERTY(TARGET ${LIB_NAME} PROPERTY VC_MDD_ANDROID_API_LEVEL "android-21")
        ELSEIF(${CMAKE_VS_PLATFORM_TOOLSET} STREQUAL "v140_clang_3_7")
            SET_PROPERTY(TARGET ${LIB_NAME} PROPERTY VS_PLATFORM_TOOLSET_OVERRIDE "v140_clang_3_7")
        ENDIF()
    ENDIF()
ENDMACRO()

IF(MINGW OR CMAKE_GENERATOR MATCHES "Unix")
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -W")

    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -W")
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wignored-qualifiers")
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -finput-charset=utf-8")

    IF(UNIX)
        SET(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
    ENDIF()

    IF(SSE)
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse")
    ELSEIF(SSE2)
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse2")
    ELSEIF(SSE3)
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse3")
    ELSEIF(SSE4)
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse3")
    ENDIF()
ELSEIF(CMAKE_GENERATOR MATCHES "Xcode")
        SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -frtti")
        SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexceptions")
        SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")

        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w")
ELSEIF(CMAKE_GENERATOR MATCHES "Visual Studio")
    IF(${CMAKE_VS_PLATFORM_TOOLSET} STREQUAL "v140_clang_3_7" OR ${CMAKE_VS_PLATFORM_TOOLSET} STREQUAL VCMDDAndroid)
        SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -frtti")
        SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexceptions")
        SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -w")

        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++1y")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w")
    ELSE()
       # 运行时类型信息
        SET(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} /GR")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR")

        # 快速的浮点模型
        SET(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} /fp:fast")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fp:fast")

        # 多处理器编译
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")

        SET(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} /W0")
        SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W0")

        # SEH
        SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /EHa")
        SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /EHa")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /EHa")
        SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /EHa")

        IF(BUILD_MUTILTHREAD_DLL)
            SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MDd")
            SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MD")
            SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MDd")
            SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD")
        ELSE()
            SET(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /MTd")
            SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /MT")
            SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
            SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
        ENDIF()

        SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2")
        SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ob2")
        SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ot")
        SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL")

        IF(BUILD_SSE)
            SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /arch:SSE")
        ENDIF()
    ENDIF()
ENDIF()

IF(CMAKE_GENERATOR MATCHES "Visual Studio")
    IF(${CMAKE_VS_PLATFORM_TOOLSET} STREQUAL "v140_clang_3_7" OR ${CMAKE_VS_PLATFORM_TOOLSET} STREQUAL VCMDDAndroid)
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Wall")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wreorder") # field 'x' will be initialized after field 'y'
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wshift-negative-value")
    ELSE()
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Wall")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4061")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4100")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4191")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4548")
        #SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4201")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4242")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4244")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4251")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4265")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4267")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4275")
        #SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4305")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4350")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4355")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4365")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4371")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4435")
        #SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4480")
        #SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4481")

        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4514")
        #SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4548")
        #SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4571")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4625")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4626")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4640")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4668")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4710")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4711")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4820")
        #SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4836")
        #SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4986")
        SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd4996")
    ENDIF()
ENDIF()

SET(HEADER_PATH ${CMAKE_SOURCE_DIR})
SET(SOURCE_PATH ${CMAKE_SOURCE_DIR})

SET(SOURCE_CODE_LIST
   ${HEADER_PATH}/rgbe.h
   ${SOURCE_PATH}/rgbe.cpp
   ${HEADER_PATH}/ies_loader.h
   ${SOURCE_PATH}/ies_loader.cpp
   ${SOURCE_PATH}/main.cpp
)
SOURCE_GROUP("source" FILES ${SOURCE_CODE_LIST})

ADD_EXECUTABLE(IES2HDR ${SOURCE_CODE_LIST})
SET_TARGET_ATTRIBUTE(IES2HDR "tools")